<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <!-- es6对象中的属性和函数简写 -->
    <script>
      var name = '张三'
      var age = 88
      // 1.对象中属性简写  和对象中函数简写
      var obj = {
        // name: name,
        name,
        age,
        // run: function() {},
        run() {}
      }
      //  2。 Object.is() 比较俩个值是否相同 true/false

      // ES5 比较两个值是否相等，只有两个运算符：相等运算符（==）和严格相等运算符（===）。
      // 它们都有缺点，前者会自动转换数据类型，后者的NaN不等于自身，以及+0等于-0。
      // 与===的区别
      //一是+0不等于-0
      Object.is(+0, -0) //false
      console.log(+0 === -0) //true
      //二是NaN等于本身
      Object.is(NaN, NaN) //true
      console.log(NaN === NaN) //false
      // Object.assign(原对象，合并对象)  合并对象
      var obj1 = {
        name: '悟空',
        age: 888,
        sex: '猴',
        shengao: 1888,
        kk: {
          eyes: 2
        }
      }
      var obj2 = {
        name: '八戒',
        tizhong: 1999,
        age: 999
      }
      // Object.assign方法实行的是浅拷贝，而不是深拷贝
      Object.assign(obj2, obj1)
      obj2.kk.eyes = 3
      console.log(obj2)

      console.log(obj1.kk.eyes)

      // 深拷贝1
      var obj5 = JSON.parse(JSON.stringify(obj1))
      //深拷贝2   递归深拷贝
      function deepClone(obj) {
        let objClone = Array.isArray(obj) ? [] : {}
        if (obj && typeof obj === 'object') {
          console.log('000')
          for (key in obj) {
            if (obj.hasOwnProperty(key)) {
              //判断ojb子元素是否为对象，如果是，递归复制
              if (obj[key] && typeof obj[key] === 'object') {
                objClone[key] = deepClone(obj[key])
              } else {
                //如果不是，简单复制
                objClone[key] = obj[key]
              }
            }
          }
        }
        return objClone
      }
    </script>
  </body>
</html>
